﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace NDF.DataAccess.Instrumentation
{
    /// <summary>
    /// 为接口 <see cref="IDataInstrumentationProvider"/> 的基础抽象实现类。
    /// 该抽象类定义一组触发器方法；当执行 <see cref="IDatabase"/> 接口实例的 Execute 相关方法时，根据执行是否报错的情况，将会触发该接口中定义的相关方法。
    /// </summary>
    public abstract class DataInstrumentationProvider : IDataInstrumentationProvider
    {
        /// <summary>
        /// 当 <see cref="System.Data.Common.DbCommand"/> 对象顺利执行完成命令时，执行该方法。
        /// </summary>
        /// <param name="startTime">表示 <see cref="System.Data.Common.DbCommand"/> 对象开始执行命令的时间。</param>
        public abstract void FireCommandExecutedEvent(DateTime startTime);

        /// <summary>
        /// 当 <see cref="System.Data.Common.DbCommand"/> 对象执行命令出错时，执行该方法。
        /// </summary>
        /// <param name="commandText">表示 <see cref="System.Data.Common.DbCommand"/> 对象执行的命令文本。</param>
        /// <param name="connectionString">表示 <see cref="System.Data.Common.DbCommand"/> 对象所使用的 <see cref="System.Data.Common.DbConnection"/> 的连接字符串信息。</param>
        /// <param name="exception">表示 <see cref="System.Data.Common.DbCommand"/> 对象执行命令出错时所触发的异常。</param>
        public abstract void FireCommandFailedEvent(string commandText, string connectionString, Exception exception);

        /// <summary>
        /// 当 <see cref="System.Data.Common.DbConnection"/> 对象操作出错时(例如 Open、Close 操作时出现异常等情况)，执行该方法。
        /// </summary>
        /// <param name="connectionString">表示 <see cref="System.Data.Common.DbConnection"/> 的连接字符串信息。</param>
        /// <param name="exception">表示 <see cref="System.Data.Common.DbConnection"/> 对象操作出错时所触发的异常。</param>
        public abstract void FireConnectionFailedEvent(string connectionString, Exception exception);

        /// <summary>
        /// 当 <see cref="System.Data.Common.DbConnection"/> 对象顺利执行 Open 方法打开数据库连接时，执行该方法。
        /// </summary>
        public abstract void FireConnectionOpenedEvent();
    }
}
